package com.sxd.bill;

import java.util.Arrays;

import com.sxd.bill.common.item.MessageItem;
import com.sxd.bill.common.item.TextLabelItem;
import com.sxd.bill.ner.CRFNerWrapper;
import com.sxd.bill.ner.utils.OutputUtility;
import com.sxd.bill.rela.RelationExtractorManager;
import com.sxd.bill.rela.item.RelationContextItem;

/**
 * Hello world!
 *
 */
public class App {
    public static void main(String[] args) throws Exception {
        // 输入数据，实际上线时，对客户端返回的结果进行构建
        MessageItem msgItem = new MessageItem();
        msgItem.setPubDate("2034-3-6");
        msgItem.setCrawTime("2024-3-6 13:37");
        msgItem.setRoomName("多多碰票群");
        msgItem.setPublisher("同创合鑫 赵达超15215707830");
        String text = "收跨年重庆 青岛农 河北 成都 天津 九江 江西 郑州 中原 稠州 宁波通商杭州联合农 萧山农 江南农 等优质城农 城贴以上可自贴\n收1月遂宁 或者2月初到期 非村贴";
        msgItem.setText(text);

        // // 一步到位抽取
        // String modelPath = "data\\model\\crfner.bin";
        // NERRE nerre = new NERRE(modelPath); // 创建模型实例
        // RelationContextItem rst = nerre.extract(msgItem); // 要素识别与关系抽取

        // 分开来(命名实体识别+关系抽取)
        // step1.命名实体识别（此处使用的是本地的模型，上线时，该步骤可以使用模型服务返回的结果）
        String modelPath = "data\\model\\crfner.bin";
        CRFNerWrapper ner = new CRFNerWrapper(modelPath); // 加载模型
        String content = msgItem.getContent(); // 格式为 -> "[发布者名称] ：[消息内容]"
        String[] tags = ner.recognize(content); // 得出模型预测每个字符的标签（BIOS）
        TextLabelItem textLabelItem = OutputUtility.getTextLabelItem(Arrays.asList(tags), content); // 根据字符标签获得要素实体

        // step2.关系抽取
        RelationExtractorManager relaManager = RelationExtractorManager.ofDefault(); // 实例化关系抽取Manager
        RelationContextItem rst = relaManager.extract_relation(textLabelItem); // 关系抽取

        // step3.补充其他信息
        rst.setPublishDate(msgItem.getPubDate());
        rst.setPublisherNickName(msgItem.getPublisher());
        rst.setRoomName(msgItem.getRoomName());
        rst.setCrawlTime(msgItem.getCrawTime());

        // step4.结果标准化（票据期限、贴现人等字段的标准化或后处理)
        rst.normalize();

        // 输出（或其他保存方式）
        System.out.println(rst);
    }

}
